package com.zxw.cmd;

import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;

public class CmdEntry implements Parcelable {

    private static final String TAG = CmdEntry.class.getSimpleName();

    public byte mode = 0;
    public byte ch1Duty = 0;
    public byte ch1DayLight = 50;
    public byte ch1NightLight = 50;
    public byte ch2Duty = 0;
    public byte ch2DayLight = 50;
    public byte ch2NightLight = 50;
    public byte ch3Duty = 0;
    public byte ch3DayLight = 50;
    public byte ch3NightLight = 50;
    public byte triggerTime = 0;
    public byte triggerMode = 0;
    public byte battery = 0;

    public CmdEntry() {

    }

    protected CmdEntry(Parcel in) {
        byte[] bytes = in.createByteArray();
        if (!putBytes(bytes)) {
            Log.e(TAG, "put data error ---");
        }
    }

    public boolean putBytes(byte[] bytes) {
        if (bytes.length != 16) {
            return false;
        }
        if (bytes[0] != 0x22) {
            return false;
        }
        if (bytes[1] != 0x01) {
            return false;
        }
        byte check = 0;
        for (int i = 0; i < 15; i++) {
            check ^= bytes[i];
        }
        check ^= 0x3C;
        if (bytes[15] != check) {
            Log.e(TAG, "put data check error ---");
            return false;
        }
        mode = bytes[2];
        ch1DayLight = bytes[3];
        ch1NightLight = bytes[4];
        ch2DayLight = bytes[5];
        ch2NightLight = bytes[6];
        ch3DayLight = bytes[7];
        ch3NightLight = bytes[8];
        ch1Duty = bytes[9];
        triggerTime = bytes[10];
        triggerMode = bytes[11];
        battery = bytes[12];
        ch2Duty = bytes[13];
        ch3Duty = bytes[14];
        return true;
    }

    public byte[] getBytes() {
        byte[] bytes = new byte[16];
        bytes[0] = 0x22;
        bytes[1] = 0x01;
        bytes[2] = mode;
        bytes[3] = ch1DayLight;
        bytes[4] = ch1NightLight;
        bytes[5] = ch2DayLight;
        bytes[6] = ch2NightLight;
        bytes[7] = ch3DayLight;
        bytes[8] = ch3NightLight;
        bytes[9] = ch1Duty;
        bytes[10] = triggerTime;
        bytes[11] = triggerMode;
        bytes[12] = battery;
        bytes[13] = ch2Duty;
        bytes[14] = ch3Duty;
        // get check value
        byte check = 0;
        for (int i = 0; i < 15; i++) {
            check ^= bytes[i];
        }
        check ^= 0x3C;
        bytes[15] = check;
        return bytes;
    }

    public String getDesString() {
        return "" + mode
                + "_" + ch1DayLight
                + "_" + ch1NightLight
                + "_" + ch2DayLight
                + "_" + ch2NightLight
                + "_" + ch3DayLight
                + "_" + ch3NightLight
                + "_" + ch1Duty
                + "_" + triggerTime
                + "_" + triggerMode
                + "_" + battery
                + "_" + ch2Duty
                + "_" + ch3Duty;
    }

    public void putDesString(String des) {
        String[] splits = des.split("_");
        if (splits.length != 13) {
            Log.e(TAG, "put des string error !");
            return;
        }

        int i = 0;
        mode = Byte.parseByte(splits[i++]);
        ch1DayLight = Byte.parseByte(splits[i++]);
        ch1NightLight = Byte.parseByte(splits[i++]);
        ch2DayLight = Byte.parseByte(splits[i++]);
        ch2NightLight = Byte.parseByte(splits[i++]);
        ch3DayLight = Byte.parseByte(splits[i++]);
        ch3NightLight = Byte.parseByte(splits[i++]);
        ch1Duty = Byte.parseByte(splits[i++]);
        triggerTime = Byte.parseByte(splits[i++]);
        triggerMode = Byte.parseByte(splits[i++]);
        battery = Byte.parseByte(splits[i++]);
        ch2Duty = Byte.parseByte(splits[i++]);
        ch3Duty = Byte.parseByte(splits[i++]);
    }

    public static final Creator<CmdEntry> CREATOR = new Creator<CmdEntry>() {
        @Override
        public CmdEntry createFromParcel(Parcel in) {
            return new CmdEntry(in);
        }

        @Override
        public CmdEntry[] newArray(int size) {
            return new CmdEntry[size];
        }
    };

    @Override
    public int describeContents() {
        return mode;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeByteArray(getBytes());
    }
}
